#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>
#define BOLCKSIG 2
void PrintPending(const sigset_t &set)
{
    for(int i = 1; i <= 31; ++i)
    {
        if(sigismember(&set, i))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

void MyHandler(int signo)
{
    std::cout << getpid() << "完成了信号递达" << signo <<std::endl;
    
    

}
int main()
{
    //自定义递达信号方式
    signal(2, MyHandler);

    sigset_t set;//要重新设置的block参照表
    sigset_t oset;//保持过去的pending表
    
    //初始化
    sigemptyset(&set);
    sigemptyset(&oset);
    
    //修改mask表，阻塞指定的信号
    sigaddset(&set, BOLCKSIG);
    sigprocmask(SIG_BLOCK, &set, &oset);
    int cnt = 5;
    while(true)
    {

        

        sigset_t curset;
        //获取pending表
        sigpending(&curset);

        //打印pending表
        PrintPending(curset);

        if(cnt-- == 0)
        {
            sigemptyset(&oset);
            //取消对所有信号的阻塞
            std::cout << "取消对所有信号的阻塞\n" << std::endl;
            sigprocmask(SIG_SETMASK, &oset, nullptr);
            cnt = 10;
        }

        sleep(1);
        
    }
    return 0;
}